/**
 * 自动补齐所有题型到50题
 * 运行：node math-academy/scripts/补齐题目到50题.js
 */

const fs = require('fs');
const path = require('path');

const ROOT = path.join(__dirname, '..', '..');
const QUESTIONS_DIR = path.join(ROOT, 'questions');
const PRIMARY_DIR = path.join(QUESTIONS_DIR, 'primary-school');
const MIDDLE_DIR = path.join(QUESTIONS_DIR, 'middle-school');

function read(file) { return fs.readFileSync(file, 'utf-8'); }
function write(file, content) { fs.writeFileSync(file, content, 'utf-8'); }

// 统计题目数量
function countQuestions(filePath) {
  const content = read(filePath);
  const matches = content.match(/\{\s*stem:/g);
  return matches ? matches.length : 0;
}

// 生成补充题目
function generateQuestion(topic, index, difficulty) {
  const templates = {
    '和差倍问题': `两个数的和是${100 + index * 10}，差是${10 + index * 2}，求这两个数。`,
    '体积计算': `一个长方体的长是${5 + index}厘米，宽是${4 + index}厘米，高是${3 + index}厘米，求体积。`,
    '几何计算': `一个长方形的长是${10 + index}厘米，宽是${6 + index}厘米，求面积和周长。`,
    '分数应用题': `一根绳子长${24 + index * 2}米，用去了1/${2 + (index % 3)}，还剩多少米？`,
    '工程问题': `甲单独完成一项工程需要${10 + index}天，乙单独完成需要${15 + index}天，两人合作需要多少天？`,
    '平均数问题': `${3 + index}个数的和是${(3 + index) * (20 + index)}，求平均数。`,
    '小数应用题': `一本书${8 + index * 0.5}元，买${3 + index}本需要多少钱？`,
    '比例应用题': `甲乙两数的比是${2 + (index % 3)}:${3 + (index % 2)}，和是${50 + index * 5}，求两数。`,
    '百分数应用题': `一件商品原价${100 + index * 10}元，打${8 + (index % 2)}折后是多少元？`,
    '盈亏问题': `分糖果，每人分${3 + index}个多${5 + index}个，每人分${4 + index}个少${3 + index}个，有多少人？`,
    '牛吃草问题': `一片草地，草每天均匀生长，${10 + index}头牛${20 + index}天吃完，${15 + index}头牛${12 + index}天吃完，求原有草量。`,
    '行程问题': `甲乙两地相距${120 + index * 10}千米，汽车每小时行${40 + index * 2}千米，需要多少小时？`,
    '逻辑推理': `有红、黄、蓝三种颜色的球各${5 + index}个，至少取出多少个才能保证有${3 + index}个同色？`,
    '计数原理': `从${5 + index}个不同的数字中选${2 + (index % 3)}个排列，有多少种方法？`,
    '归一问题': `${3 + index}台机器${4 + index}小时生产${(3 + index) * (4 + index) * 10}个零件，1台机器1小时生产多少个？`,
    '植树问题': `一条路长${100 + index * 10}米，每隔${5 + index}米种一棵树，两端都种，需要多少棵树？`,
    '数论基础': `求${10 + index * 2}和${15 + index * 3}的最大公约数和最小公倍数。`,
    '时钟问题': `现在是${8 + (index % 12)}点整，再过${30 + index * 5}分钟是几点几分？`,
    '日历问题': `某月有${4 + (index % 2)}个星期日，这个月最多有多少天？`,
    '排列组合': `从${6 + index}个人中选${3 + (index % 3)}个人参加比赛，有多少种选法？`,
    '空间想象': `一个正方体的棱长是${5 + index}厘米，表面积是多少？`,
    '面积计算': `一个圆的半径是${5 + index}厘米，求面积。（π取3.14）`,
    '数字谜题': `一个两位数，十位数字是${3 + (index % 7)}，个位数字是${5 + (index % 5)}，这个数是多少？`,
    '图形计数': `一个${3 + index}×${3 + index}的方格，有多少个小正方形？`,
    '抽屉原理': `有${10 + index}个苹果放入${3 + (index % 4)}个抽屉，至少有一个抽屉放了多少个苹果？`,
    '一元一次方程': `解方程：${2 + index}x + ${5 + index} = ${15 + index * 2}`,
    '二元一次方程组': `解方程组：x + y = ${10 + index}，x - y = ${2 + index}`,
    '代数综合': `化简：(${2 + index}x + ${3 + index})(${2 + index}x - ${3 + index})`,
    '动点问题': `点P从A出发，以${2 + index}米/秒的速度向B运动，AB距离${20 + index * 2}米，多少秒后P到达B？`,
    '反比例函数': `已知y与x成反比例，当x=${2 + index}时y=${6 + index}，求函数解析式。`,
    '圆的性质': `一个圆的半径是${5 + index}厘米，求周长和面积。`,
    '应用题综合': `某商店进货${100 + index * 10}件商品，成本${(100 + index * 10) * (20 + index)}元，售价每件${30 + index}元，求利润。`,
    '数据分析': `一组数据：${10 + index}, ${12 + index}, ${14 + index}, ${16 + index}, ${18 + index}，求平均数。`,
    '相似三角形': `两个相似三角形，对应边之比是${2 + (index % 3)}:${3 + (index % 2)}，小三角形面积是${12 + index}，求大三角形面积。`,
    '统计与概率': `一个袋子里有${5 + index}个红球和${3 + index}个白球，随机摸一个，摸到红球的概率是多少？`,
    '解直角三角形': `直角三角形，一条直角边是${3 + index}，另一条直角边是${4 + index}，求斜边。`,
    '回归分析': `一组数据的回归方程是y=${2 + index}x+${3 + index}，当x=${5 + index}时，预测y的值。`,
    '实际应用': `某工厂计划${10 + index}天生产${(10 + index) * (100 + index * 10)}个零件，实际每天多生产${10 + index}个，实际用了多少天？`,
    '数学建模': `某城市人口每年增长${2 + (index % 3)}%，现有人口${100 + index * 10}万，${5 + index}年后人口约多少万？`,
    '竞赛基础': `求${10 + index * 2}的所有因数之和。`,
    '综合压轴题': `已知函数y=${2 + index}x²+${3 + index}x+${4 + index}，求顶点坐标。`,
    '不等式': `解不等式：${2 + index}x + ${3 + index} > ${10 + index * 2}`,
    '函数基础': `已知函数y=${2 + index}x+${3 + index}，当x=${5 + index}时，求y的值。`,
  };

  const stem = templates[topic] || `${topic}练习题${index + 1}：请根据题型特点完成此题。`;
  
  return {
    stem,
    difficulty,
    answer: [0], // 占位答案，需要人工或AI计算
    hint1: "分析题目条件",
    hint2: "列出计算步骤",
    solution: "【待完善】此题目为自动生成，解析待补充。"
  };
}

// 补齐文件到50题
function fillToFifty(filePath) {
  const topic = path.basename(filePath, '.ts');
  const count = countQuestions(filePath);
  
  if (count >= 50) {
    console.log(`✅ ${topic}: 已有${count}题，无需补充`);
    return { topic, before: count, after: count, added: 0 };
  }
  
  const needed = 50 - count;
  console.log(`🔄 ${topic}: 当前${count}题，需补充${needed}题...`);
  
  const content = read(filePath);
  
  // 提取现有题目数组
  const match = content.match(/export const ([A-Za-z0-9_\u4e00-\u9fa5]+) = \[([\s\S]*?)\];/);
  if (!match) {
    console.log(`❌ ${topic}: 无法解析文件格式`);
    return { topic, before: count, after: count, added: 0, error: true };
  }
  
  const varName = match[1];
  const existingArray = match[2];
  
  // 生成新题目
  const newQuestions = [];
  for (let i = 0; i < needed; i++) {
    const difficulty = i < needed * 0.2 ? 1 : 
                      i < needed * 0.5 ? 2 : 
                      i < needed * 0.8 ? 3 : 
                      i < needed * 0.95 ? 4 : 5;
    newQuestions.push(generateQuestion(topic, count + i, difficulty));
  }
  
  // 构建新题目字符串
  const newQuestionsStr = newQuestions.map(q => {
    return `  { stem: "${q.stem}", difficulty: ${q.difficulty}, answer: ${JSON.stringify(q.answer)}, hint1: "${q.hint1}", hint2: "${q.hint2}", solution: "${q.solution}" }`;
  }).join(',\n');
  
  // 重建文件
  const newContent = content.replace(
    /export const ([A-Za-z0-9_\u4e00-\u9fa5]+) = \[([\s\S]*?)\];/,
    `export const ${varName} = [\n${existingArray.trim()},\n${newQuestionsStr}\n];`
  );
  
  write(filePath, newContent);
  
  console.log(`✅ ${topic}: 补充完成，现有50题`);
  return { topic, before: count, after: 50, added: needed };
}

function main() {
  console.log('🚀 开始补齐所有题型到50题...\n');
  
  const results = [];
  
  // 处理小学题库
  console.log('📚 处理小学题库...');
  for (const file of fs.readdirSync(PRIMARY_DIR).filter(f => f.endsWith('.ts'))) {
    const result = fillToFifty(path.join(PRIMARY_DIR, file));
    results.push(result);
  }

  // 处理初中题库
  console.log('\n📚 处理初中题库...');
  for (const file of fs.readdirSync(MIDDLE_DIR).filter(f => f.endsWith('.ts'))) {
    const result = fillToFifty(path.join(MIDDLE_DIR, file));
    results.push(result);
  }
  
  // 统计
  console.log('\n📊 补齐统计：');
  console.log('='.repeat(60));
  const totalAdded = results.reduce((sum, r) => sum + r.added, 0);
  const totalFiles = results.length;
  const modifiedFiles = results.filter(r => r.added > 0).length;
  
  console.log(`总题型数: ${totalFiles}个`);
  console.log(`已修改题型: ${modifiedFiles}个`);
  console.log(`新增题目: ${totalAdded}题`);
  console.log(`总题目数: ${totalFiles * 50}题`);
  console.log('='.repeat(60));
  
  // 保存报告
  const reportPath = path.join(ROOT, 'math-academy', 'docs', '补齐题目报告.json');
  write(reportPath, JSON.stringify(results, null, 2));
  console.log(`\n📄 详细报告已保存到: ${reportPath}`);
  
  console.log('\n✅ 补齐完成！');
  console.log('\n⚠️  注意：新增题目的答案和解析需要进一步完善！');
}

main();

